package com.demo.common.response;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 统一响应结果类
 * 用于封装所有API接口的返回结果，提供统一的响应格式
 *
 * @param <T> 数据类型
 * @author demo
 * @since 1.0.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应状态码
     * 200: 成功
     * 400: 客户端错误
     * 500: 服务器错误
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 扩展字段，用于存储额外的键值对数据
     */
    private Map<String, Object> map = new HashMap<>();

    // 成功响应状态码
    public static final int SUCCESS_CODE = 200;
    // 客户端错误状态码
    public static final int CLIENT_ERROR_CODE = 400;
    // 服务器错误状态码
    public static final int SERVER_ERROR_CODE = 500;

    /**
     * 返回成功结果（无数据）
     *
     * @param <T> 数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success() {
        Result<T> result = new Result<>();
        result.code = SUCCESS_CODE;
        result.msg = "操作成功";
        return result;
    }

    /**
     * 返回成功结果（带数据）
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.code = SUCCESS_CODE;
        result.msg = "操作成功";
        result.data = data;
        return result;
    }

    /**
     * 返回成功结果（自定义消息和数据）
     *
     * @param msg  响应消息
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success(String msg, T data) {
        Result<T> result = new Result<>();
        result.code = SUCCESS_CODE;
        result.msg = msg;
        result.data = data;
        return result;
    }

    /**
     * 返回错误结果（默认400状态码）
     *
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return 错误结果
     */
    public static <T> Result<T> error(String msg) {
        Result<T> result = new Result<>();
        result.code = CLIENT_ERROR_CODE;
        result.msg = msg;
        return result;
    }

    /**
     * 返回错误结果（自定义状态码）
     *
     * @param code 状态码
     * @param msg  错误消息
     * @param <T>  数据类型
     * @return 错误结果
     */
    public static <T> Result<T> error(Integer code, String msg) {
        Result<T> result = new Result<>();
        result.code = code;
        result.msg = msg;
        return result;
    }

    /**
     * 返回服务器错误结果（500状态码）
     *
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return 服务器错误结果
     */
    public static <T> Result<T> serverError(String msg) {
        Result<T> result = new Result<>();
        result.code = SERVER_ERROR_CODE;
        result.msg = msg;
        return result;
    }

    /**
     * 添加扩展字段
     *
     * @param key   键
     * @param value 值
     * @return 当前结果对象（支持链式调用）
     */
    public Result<T> add(String key, Object value) {
        if (this.map == null) {
            this.map = new HashMap<>();
        }
        this.map.put(key, value);
        return this;
    }

    /**
     * 判断是否成功
     *
     * @return 是否成功
     */
    public boolean isSuccess() {
        return SUCCESS_CODE == this.code;
    }

    /**
     * 判断是否失败
     *
     * @return 是否失败
     */
    public boolean isError() {
        return !isSuccess();
    }
}